use std::{env, fs, path::Path};

fn add_cpp_files(build: &mut cc::Build, dir: &Path) {
    for entry in fs::read_dir(dir).unwrap() {
        let entry = entry.unwrap();
        let path = entry.path();
        if path.is_dir() {
            add_cpp_files(build, &path); // 递归处理子目录
        } else if path.extension().and_then(|s| s.to_str()) == Some("cc") {
            build.file(&path); // 添加 C++ 源文件
            println!("cargo:rerun-if-changed={}", path.display()); // 监控文件变更
        }
    }
}

fn main() {
    let cpp_dir = Path::new("c++");
    let mut build = cc::Build::new();

    build.cpp(true);
    build.flag_if_supported("-std=c++23"); 

    // 动态添加 cpp 文件
    add_cpp_files(&mut build, cpp_dir);

    // 设置编译器
    // MARK：在我的机器上，gcc 默认为 gcc-13，我不想修改，但 gcc-13 不完全支持 c++23
    build.compiler("gcc-14");

    // 设置为静态库输出
    build.static_flag(true);

    // 编译静态库
    build.compile("preprocess");

    // 指定 cargo 链接静态库路径
    let out_dir = env::var("OUT_DIR").unwrap();
    println!("cargo:rustc-link-search=native={}", out_dir);

    // 使用静态库链接
    println!("cargo:rustc-link-lib=static=preprocess");
}
